package com.pin.si.www.common.pojo.result;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import static com.pin.si.www.common.enums.GlobalHttpStateCodeConstants.SUCCESS;

/**
 * 通用返回结果
 *
 * @param <T> 数据类型
 */
@Getter
@Setter
@ToString
@EqualsAndHashCode(callSuper = true)
public class CommonResult<T> extends AbstractResult {

    /**
     * 返回数据
     */
    private T data;

    public CommonResult(Integer code, String msg, T data) {
        super(code, msg);
        this.data = data;
    }

    /**
     * 成功返回结果
     *
     * @param <T> 数据类型
     * @return 成功结果
     */
    public static <T> CommonResult<T> success() {
        return new CommonResult<>(SUCCESS.getCode(), SUCCESS.getMsg(), null);
    }

    /**
     * 成功返回结果
     *
     * @param data 返回数据
     * @param <T>  数据类型
     * @return 成功结果
     */
    public static <T> CommonResult<T> success(T data) {
        return new CommonResult<>(SUCCESS.getCode(), SUCCESS.getMsg(), data);
    }

    /**
     * 失败返回结果
     *
     * @param errorCode 错误码
     * @param <T>       数据类型
     * @return 失败结果
     */
    public static <T> CommonResult<T> failed(ErrorCode errorCode) {
        return new CommonResult<>(errorCode.getCode(), errorCode.getMsg(), null);
    }

    /**
     * 失败返回结果
     *
     * @param errorCode 错误码
     * @param msg       自定义错误信息
     * @param <T>       数据类型
     * @return 失败结果
     */
    public static <T> CommonResult<T> failed(ErrorCode errorCode, String msg) {
        return new CommonResult<>(errorCode.getCode(), msg, null);
    }

}